perm filename SOUND.FAI[MUS,LCS]4 blob sn#138028 filedate 1974-12-31 generic text, type T, neo UTF8
00100		TITLE	SOUND;  DOROTHY BENDER ****** 1969 *******
00200	
00300	;  ROUTINE TO READ THE OUTPUT FROM THE MUSIC
00400	;  PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
00500	;  
00600	;  NAME OF THE FILE TO BE INPUTTED IS 'MUSIC.MUS' OR 'MUSAA.DMD',
00700	;  THE FIRST RECORD OF WHICH CONTAINS THE
00800	;  NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
00900	
01000	A   ←   1     ;WORK
01100	B   ←   2     ;WORK
01200	RET ←   3     ;RETURN ACCUMULATOR
01300	BUFSIZ ←=20224   ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!	
01400	↓DSKCHN ←1             ;DISK CHANNEL FOR INPUT
01500	↓ADCHN  ←2             ;D-A CHANNEL FOR OUTPUT
01600	
01700		OPDEF	READCH [51B8]
01800	        OPDEF   MESSAGE[51B8!3B12]
01900	
02000	BEG:	CALLI	0,0         ;RESET I/O DEVICES
02100	 	OPEN 	DSKCHN,[17  ;MODE
02200			'DSK   '    ;DEVICE NAME
02300	 		0]          ;NO BUFFER HEADERS
02400		HALT	BEG         ;RESTART IF DEVICE IS UNAVAILABLE
02500	
02600	 	SETZM	FILBLK+3    ;FOR RESTART
02700	 	SETZM	FILBL2+3    ;FOR RESTART
02800	LX:	MESSAGE [ASCIZ/
02900	  TYPE `P' TO PLAY FROM DISK, `C' TO COPY TAPE TO DISK.
03000	/]
03100		readch a
03200		cain a,"C"
03300		jrst start
03400		caie a,"P"
03500		jrst lx
03600		skipe filblk+3	;is this first time through ?
03700		jrst pla2	;No. Parameters already set up.
03800		;FIND OUT NUMBER OF CHANNELS AND
03900		;THE SPEED.
04000	
04100		MESSAGE	[ASCIZ/HOW MANY CHANNELS?/]
04200		READCH	A
04300		SUBI	A,"0"+1		;CONVERT TO BINR AND ADD 1
04400		DPB	A,[POINT 2,OUTBIT,26]
04500	
04600		MESSAGE [ASCIZ/WHAT IS THE SPEED?/]
04700		READCH  A
04800		SUBI	A,"0"
04900		DPB	A,[POINT 3,OUTBIT,32]
05000	
05100	PLA2:	SETZM FILBLK+3
05200		SETZM FILBL2+3
05300		LOOKUP	DSKCHN,FILBLK
05400		SKIPA			;CAN'T FIND MUSIC.MUS
05500		JRST XOPEN		;FOUND IT
05600		LOOKUP  DSKCHN,FILBL2	;TRY FOR MUSAA.DMD
05700	
05800		JRST	[MESSAGE[ASCIZ/
05900			*** MUSIC FILE NOT FOUND/]
06000			CALLI  12]
06100	        ;EXIT IF FILE IS MISSING
06200		MOVE A,FILBL2+3	;GET LENGTH OF MUSAA.DMD
06300		MOVEM A,FILBLK+3;PUT IT IN RIGHT PLACE
06400	
06500	XOPEN:	MOVSI	'XGP'	;DOWN TO XGPOK FOR XGP CONFLICT.
06600		DEVUSE	0,	
06700		HLRZ 	0,0
06800		CAIN	400000
06900		JRST	XGPOK
07000		INIT	16,17
07100		SIXBIT	.XGP.
07200		0
07300		JRA	16,2(16)
07400	XGPOK:	OPEN	ADCHN,[117 	;MODE
07500	         	'AD    '        ;DEVICE NAME
07600	 		0]              ;NO BUFFER HEADERS
07700	
07800	  	JRST	[MESSAGE[ASCIZ/
07900			***D-A NOT AVAILABLE/]
08000			CALLI  12]
08100		;EXIT IF D-A IS UNAVAILABLE
08200	
08250	SPWAR:	LOCK A,
08300		SPCWAR 17,[CALLI]
08400	;;	MESSAGE [ASCIZ/ GO? /]
08500	;;	READCH A
08600	
08700	
08800	LNTH:	movs a,filblk+3		;get length of file.
08900		movnm a,nwd
09000	
09100	;	-----------------------------------------
09200	
09300		;BEGIN MAIN BODY OF PROGRAM
09400	
09500	LOOP:	JSP	RET,SUB		;ROUTINE TO READ AND WRITE
09600		BUF1-1 			;USE BUF1 FOR THE I/O
09700		JUMPLE	B,OUT    	;DONE
09800		
09900		JSP	RET,SUB		;CALL IT AGAIN
10000		BUF2-1			;USE BUF2 FOR THE I/O
10100		JUMPG	B,LOOP		;GO BACK FOR MORE IF B>0
10200	
10300	OUT:	close dskchn,		;END OF PROGRAM.
10400		releas adchn,
10500		SPCWAR 0,'SSW'
10550		UNLOCK
10600		RELEASE 16,
10700		jrst lx
10800	
10900		;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
11000		;  1(RET) WILL BE THE RETURN
11100		;  0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
11200		;         PUT IN THE RIGHT HALF OF THE IOWD.
11300		;  A      WILL BE A WORK REGISTER
11400	    	;  B      WILL BE TESTED ON THE OUTSIDE.
11500	
11600	SUB:	MOVNI	A,BUFSIZ	;PICK UP AND COMPLEMENT BUFSIZ
11700		ADDB	A,NWD		;A←NWD-BUFSIZ
11800					;NWD←NWD-BUFSIZ
11900		MOVE	B,A		;SAVE B TO BE TESTED FOR LAST
12000					;TIME.
12100		JUMPL	A,LAST		;SET UP FOR LAST TIME.
12200		MOVEI	A,0		
12300	
12400		;THE IOWD LOOKS LIKE:
12500		;  [-BUFSIZ / BUFI-1]
12600	
12700	LAST:	ADDI	A,BUFSIZ
12800		MOVNS	A		;COMPLEMENT A
12900		HRL	A,0(RET)	;PICK UP BUFI AND MOVE IT
13000					;TO THE LEFT SIDE OF A.
13100		MOVSM	A,INLIST	;SWAP A AND MOVE IT.
13200		MOVSM	A,OUTWC		;SAME FOR OUTPUT.
13300		INPUT	DSKCHN,INLIST	;READ A RECORD.
13400		OUTPUT	ADCHN,OUTWC	;WRITE THE RECORD.
13500		JRST	1(RET)		;RETURN
13600	
13700	;	-----------------------------------------
13800	
13900	; STORAGE:
14000	
14100	NWD:	0			;FOR NUMBER OF WORDS OF INPUT.
14200	↓BUF1:	BLOCK	BUFSIZ+1	;BUFFER 1
14300	BUF2:	BLOCK	BUFSIZ+1	;BUFFER 2
14400	
14500	FILBLK: 'MUSIC '		;FILENAME FOR INPUT
14600		'MUS   '			;EXTENSION
14700		0			;INFORMATION ON FILE
14800		0			;PROJECT PROG#
14900	
15000	FILBL2: 'MUSAA '		;FILENAME FOR INPUT, 2ND CHOICE
15100		'DMD   '			;EXTENSION
15200		0			;INFORMATION ON FILE
15300		0			;PROJECT PROG#
15400	
15500	CLIST:	IOWD	1,NWD		;FOR THE FIRST RECORD
15600		0
15700	
15800	INLIST:	0			;WILL CONTAIN AN IOWD
15900		0
16000	
16100	OUTWC:	0			;WILL CONTAIN AN IOWD FOR D-A
16200		3650			;MAGIC BITS FOR 136.
16300	OUTBIT: 4000			;BITS FOR D-A
16400		BLOCK	2
16500	
16600	begin magdsk
16700	
16800	A←1
16900	B←2
17000	D←3
17100	OLNG←=2432	;size of mag tape records. must be multiple of =128.
17200	
17300	ILNG←=2432
17400	ichn←adchn
17500	ochn←dskchn
17600	↑START:	CALLI 0
17700		INIT ICHN,3B28+17
17800		SIXBIT /MTA0/
17900		0
18000		HALT
18100		MTAPE ICHN,1	;REWIND THE TAPE
18200		JFCL
18300		INIT OCHN,17
18400		SIXBIT /DSK/
18500		0
18600		HALT
18700		ENTER OCHN,[SIXBIT /MUSIC/
18800	                    SIXBIT /MUS/
18900		            0
19000		            0]
19100		HALT
19200		loop:input ichn,olst
19300			statz ichn,20000
19400			jrst out	;end of tape.
19500			output ochn,olst
19600			jrst loop
19700	OLST:	IOWD OLNG,OBUF
19800		0
19900	obuf←← buf1
20000		bend magdsk
20100	
20200	end beg